﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace Ukagaka.Named.Ghost.SakuraScript
{
	/// <summary>
	/// パラメータを表現します
	/// </summary>
	[Serializable]
	public class Parameter : IEnumerable<string>
	{
		/// <summary>
		/// コンテンツを取得します
		/// </summary>
		public List<string> Contents
		{
			get;
			private set;
		}

		/// <summary>
		/// パラメータを表現するインスタンスを作成します
		/// </summary>
		/// <param name="contents">コンテンツ</param>
		public Parameter( string contents )
			: this( ContentsParse( contents ) )
		{
			// do nothing
		}

		/// <summary>
		/// パラメータを表現するインスタンスを作成します
		/// </summary>
		/// <param name="contents">コンテンツ</param>
		public Parameter( params string[ ] contents )
			: this( ( IEnumerable<string> )contents )
		{
			// do nothing
		}

		/// <summary>
		/// パラメータを表現するインスタンスを作成します
		/// </summary>
		/// <param name="contents">コンテンツ</param>
		public Parameter( IEnumerable<string> contents )
		{
			Contents = new List<string>( );

			if ( null != contents )
			{
				Contents.AddRange( contents );
			}
		}

		/// <summary>
		/// パラメータを取得します
		/// </summary>
		/// <returns>パラメータ</returns>
		public override string ToString( )
		{
			return string.Concat( '[', string.Join( ",", Contents ), ']' );
		}

		/// <summary>
		/// コンテンツを反復処理する列挙子を取得します
		/// </summary>
		/// <param name="contents">コンテンツ</param>
		/// <returns>コンテンツを反復処理する列挙子</returns>
		private static IEnumerable<string> ContentsParse( string contents )
		{
			return contents.Split( new char[ ] { ',' } );
		}

		#region IEnumerable<string> メンバー

		/// <summary>
		/// コンテンツを反復処理する列挙子を取得します
		/// </summary>
		/// <returns>コンテンツを反復処理する列挙子</returns>
		public IEnumerator<string> GetEnumerator( )
		{
			return Contents.GetEnumerator( );
		}

		#endregion

		#region IEnumerable メンバー

		/// <summary>
		/// コンテンツを反復処理する列挙子を取得します
		/// </summary>
		/// <returns>コンテンツを反復処理する列挙子</returns>
		IEnumerator IEnumerable.GetEnumerator( )
		{
			return GetEnumerator( );
		}

		#endregion
	}
}
